home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / pack / iff / iffdecrunch.s next >
Text File  |  1980-01-03  |  4KB  |  212 lines

  1. *****************************************************************************
  2. * IFF ILBM-2-BITMAP BITPLANES                 Used Registers Preserved
  3. * ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  4. * Converts an IFF Picture (Packed or Non-Packed) to raw-bitmap non-
  5. * interleaved bitplanes. Colours are also Converted and saved after bitplanes
  6. * This version is only for standard IFF pictures with 64-Colours or less!
  7. *
  8. * INPUTS:    a0=Source IFF ILBM Picture    a1=Destination BITPLANES
  9. *        a2=Palette Buffer (IF a2=0 , no palette colors extracted!)
  10. * OUTPUTS:    None.
  11. *****************************************************************************
  12.         
  13. IFFDecrunch    movem.l    d0-d7/a0-a6,-(sp)
  14.         lea    PalettePt(pc),a6
  15.         move.l    a2,(a6)            ;save palette destination adr
  16.         bsr.s    IFF2BM            ;decrunch picture
  17.         movem.l    (sp)+,d0-d7/a0-a6
  18.  
  19.         move.l    widby(pc),d0        ;screen width (in bytes)
  20.         move.w    height(pc),d1        ;screen height (in pixels)
  21.         move.l    PlaneSize(pc),d2    ;size of one bitplane
  22.         moveq    #0,d3
  23.         move.b    bplanes(pc),d3        ;number of bitplanes
  24.         rts
  25.         
  26. IFF2BM        move.l    a0,a3
  27. getiff        moveq    #1,d5
  28.         cmp.l    #'FORM',(a0)+        ; check ID, iff piccy ?
  29.         bne.w    notiff
  30.           cmp.l    #'ILBM',4(a0)        ; interleaved bitmap ?
  31.         bne.w    notiff
  32.         move.l    #'BMHD',d0
  33.         addq.l    #8,a0
  34.  
  35. iscmap        cmp.l    (a0),d0
  36.         beq.s    dimen
  37.          tst.l    (a0)+
  38.         add.l    (a0)+,a0
  39.         bra.s    iscmap
  40.  
  41. dimen        addq.l    #8,a0
  42.         lea    width(pc),a4
  43.         move.l    (a0),(a4)
  44.         move.b    8(a0),bplanes-width(a4)
  45.         move.l    a0,a5
  46.         move.l    #'BODY',d0
  47.         move.l    a3,a0
  48.         lea    12(a0),a0
  49.  
  50. isbody        cmp.l    (a0),d0
  51.         beq.s    bitmap
  52.          tst.l    (a0)+
  53.         add.l    (a0)+,a0
  54.         bra.s    isbody
  55.      
  56. bitmap        addq.l    #8,a0
  57.         move.l    a0,datast-width(a4)
  58.         moveq    #0,d0
  59.         move.w    (a4),d0        ;get width
  60.         cmp.w    #16,d0
  61.         bhi.s    contin
  62.      
  63.         moveq    #2,d0
  64.         move.l    d0,widby-width(a4)
  65.         bra.s    mqwe
  66.      
  67. contin        lsr    #4,d0
  68.         swap    d0
  69.         tst.w    d0
  70.         beq.s    cont
  71.      
  72.         swap    d0
  73.         add.w    d5,d0
  74.         swap    d0
  75. cont        swap    d0
  76.         add.w    d0,d0
  77.         and.l    #$FFFF,d0
  78.         move.l    d0,widby-width(a4)
  79.  
  80. mqwe        mulu    height(pc),d0
  81.         move.l    d0,planeSize-width(a4)
  82.         mulu    planes(pc),d0
  83.         move.l    d0,planetot-width(a4)
  84.          
  85.         move.l    planetot(pc),d1
  86.         move.l    widby(pc),d2
  87.         move.l    datast(pc),a0
  88.  
  89.         move.l    planetot(pc),d1
  90.         tst.b    10(a5)            ;is data ByteRun compressed ?
  91.         bne.s    compressed
  92.      
  93. planego        moveq    #0,d3
  94. loopy        add.w    d5,d3
  95.         move.l    widby(pc),d2
  96.         sub.w    d5,d2
  97.  
  98. looptranz    move.b    (a0)+,(a1)+
  99.         sub.l    d5,d1
  100.         dbra    d2,looptranz
  101.  
  102.         tst.l    d1
  103.         beq.w    getcmap
  104.      
  105.         cmp.w    planes(pc),d3
  106.         beq.s    plane1
  107.  
  108.         add.l    planeSize(pc),a1
  109.         sub.l    widby(pc),a1
  110.         bra.s    loopy
  111.  
  112. plane1        move.l    planetot(pc),d4
  113.         sub.l    planeSize(pc),d4
  114.         sub.l    d4,a1
  115.         bra.s    planego
  116.  
  117. compressed    move.l    -4(a0),d1
  118. planeeq1    moveq    #0,d7
  119. nextplane    add.b    d5,d7
  120.         moveq    #0,d2
  121. loopgb        move.b    (a0),d0
  122.         cmp.b    #128,d0
  123.         beq.s    noop
  124.      
  125.         bclr    #7,d0
  126.         beq.s    uplit
  127.          bne.s    uprepl
  128.  
  129. ret        cmp.b    store2(pc),d2
  130.         bne.s    loopgb
  131. here        tst.l    d1
  132.         beq.s    getcmap
  133.  
  134.         cmp.b    bplanes(pc),d7
  135.         beq.s    plane1er
  136.  
  137.         add.l    planeSize(pc),a1
  138.         sub.l    widby(pc),a1
  139.         bra.s    nextplane
  140.  
  141. plane1er    sub.l    planetot(pc),a1
  142.         add.l    planeSize(pc),a1
  143.         bra.s    planeeq1
  144.  
  145. noop        sub.l    d5,d1
  146.         add.l    d5,a0
  147.         bra.s    ret
  148.  
  149. uplit        add.b    d0,d2
  150.         add.b    d5,d2
  151.         add.l    d5,a0
  152.         subq.l    #2,d1
  153.         ext.w    d0
  154.         ext.l    d0
  155.         sub.l    d0,d1
  156.  
  157. looptrans    move.b    (a0)+,(a1)+
  158.         dbra    d0,looptrans
  159.          bra.s    ret
  160.  
  161. uprepl        move.b    #128,d3
  162.         sub.b    d0,d3
  163.         add.b    d3,d2
  164.         add.b    d5,d2
  165.         move.b    1(a0),d0
  166.         addq.w    #2,a0
  167.         subq.l    #2,d1
  168.         ext.w    d3
  169.         ext.l    d3
  170.  
  171. looprepl    move.b    d0,(a1)+
  172.         dbra    d3,looprepl
  173.          bra.s    ret
  174.  
  175. getcmap:    move.l    a3,a0
  176.         lea    40(a0),a0
  177.         move.l    (a0)+,d0
  178.         lea    4(a0),a1
  179.         move.l    PalettePt(pc),a2    ; dest for save palette
  180.         move.l    a2,d0
  181.         beq.s    doneok
  182.         moveq.l    #32-1,d0
  183. getc:        moveq    #0,d1
  184.         move.b    (a1)+,d1
  185.         rol.w    #4,d1
  186.         move.b    (a1)+,d1
  187.         move.b    (a1)+,d2
  188.         lsr.b    #4,d2
  189.         or.b    d2,d1
  190.         move.w    d1,(a2)+
  191.         dbra    d0,getc
  192. doneok        rts
  193.  
  194. notiff        moveq    #-1,d0
  195.         rts
  196.  
  197. PalettePt    dc.l    0
  198. planetot    dc.l    0
  199. planeSize    dc.l    0
  200. datast        dc.l    0
  201. width        dc.w    0
  202. height        dc.w    0
  203. widby        dc.w    0 ;\
  204. widbylow    dc.b    0 ; \
  205. store2        dc.b    0 ;  \_attached do not move!
  206. planes        dc.b    0
  207. bplanes        dc.b    0
  208. swidth        dc.w    0
  209. NumCols        dc.w    0
  210.  
  211.  
  212.